#ifndef ETAT_H_
#define ETAT_H_

#include <map>
#include <string>
#include <iostream>

class Robot;
class Etat;

extern std::map<std::string, Etat*> mapEtats;
extern Robot* robot;

class Etat {
	
	public:
		class MauvaisEtat {
			const char* erreur;
			public:
				MauvaisEtat(const char *p){erreur=p;}
				MauvaisEtat(){erreur="Mauvais Etat";};
				const char* geterreur(){return erreur;}
		};
	
	public:
		/**
		 * construit un Etat
		 */
		Etat(std::string t) 
		{
			mapEtats[t] = this;
		}
		
		virtual ~Etat() {}
		
		/**
		 * change le robot
		 */
		void setRobot(Robot* r)
		{
			robot = r;
		}
		
		virtual void avancer() {throw MauvaisEtat("avancer");}
		virtual void tourner() {throw MauvaisEtat("tourner");}
		virtual void saisir() {throw MauvaisEtat("saisir");}
		virtual void poser() {throw MauvaisEtat("poser");}
		virtual void peserObjet() {throw MauvaisEtat("peserObjet");}
		virtual void evaluerObstacle() {throw MauvaisEtat("evaluerObstacle");}
		virtual void arreter() {throw MauvaisEtat("arrêter");}
		virtual void repartir() {throw MauvaisEtat("repartir");}
		virtual std::string getTag() = 0;
		void afficherEtat() {std::cout << getTag() << std::endl;}
};

#endif /*ETAT_H_*/
